Geospatial_05_exercise
import math
import geopandas as gpd
import pandas as pd
from shapely.geometry import MultiPolygon
import folium
from folium import Choropleth, Marker
from folium.plugins import HeatMap, MarkerCluster
from learntools.core import binder
binder.bind(globals())
from learntools.geospatial.ex5 import *
embed_map() 함수를 사용하여 지도를 시각화할 수 있습니다.
def embed_map(m, file_name):
from IPython.display import IFrame
m.save(file_name)
return IFrame(file_name, width='100%', height='500px')
collisions = gpd.read_file("data/NYPD_Motor_Vehicle_Collisions/NYPD_Motor_Vehicle_Collisions/NYPD_Motor_Vehicle_Collisions.shp")
collisions.head()
"LATITUDE" 및 "LONGITUDE" 열을 사용하여 충돌 데이터를 시각화하는 대화형 맵을 만듭니다. 어떤 종류의 지도가 가장 효과적이라고 생각하세요?
m_1 = folium.Map(location=[40.7, -74], zoom_start=11)
# Your code here: Visualize the collision data
HeatMap(data=collisions[['LATITUDE', 'LONGITUDE']], radius=9).add_to(m_1)
# Get credit for your work after you have created a map
q_1.check()
# Show the map
m_1
hospitals = gpd.read_file("data/nyu_2451_34494/nyu_2451_34494/nyu_2451_34494.shp")
hospitals.head()
"위도" 및 "경도" 열을 사용하여 병원 위치를 시각화합니다.
m_2 = folium.Map(location=[40.7, -74], zoom_start=11)
# Your code here: Visualize the hospital locations
for idx, row in hospitals.iterrows():
Marker([row['latitude'], row['longitude']], popup=row['name']).add_to(m_2)
# Get credit for your work after you have created a map
q_2.check()
# Show the map
m_2
coverage = gpd.GeoDataFrame(geometry=hospitals.geometry).buffer(10000)
my_union = coverage.geometry.unary_union
outside_range = collisions.loc[~collisions["geometry"].apply(lambda x: my_union.contains(x))]
# Check your answer
q_3.check()
다음 코드 셀은 가장 가까운 병원에서 10km 이상 떨어진 곳에서 발생한 충돌 비율을 계산합니다.
percentage = round(100*len(outside_range)/len(collisions), 2)
print("Percentage of collisions more than 10 km away from the closest hospital: {}%".format(percentage))
def best_hospital(collision_location):
idx_min = hospitals.geometry.distance(collision_location).idxmin()
my_hospital = hospitals.iloc[idx_min]
name = my_hospital["name"]
return name
# Test your function: this should suggest CALVARY HOSPITAL INC
print(best_hospital(outside_range.geometry.iloc[0]))
# Check your answer
q_4.check()
highest_demand = outside_range.geometry.apply(best_hospital).value_counts().idxmax()
# Check your answer
q_5.check()
m_6 = folium.Map(location=[40.7, -74], zoom_start=11)
coverage = gpd.GeoDataFrame(geometry=hospitals.geometry).buffer(10000)
folium.GeoJson(coverage.geometry.to_crs(epsg=4326)).add_to(m_6)
HeatMap(data=outside_range[['LATITUDE', 'LONGITUDE']], radius=9).add_to(m_6)
folium.LatLngPopup().add_to(m_6)
m_6
지도의 아무 곳이나 클릭하면 해당 위치가 위도 및 경도로 표시된 팝업이 나타납니다.
뉴욕시는 두 개의 새로운 병원을 위한 장소를 결정하는 데 도움을 요청했습니다. 이들은 특히 *3) 단계에서 계산된 백분율을 10% 미만으로 낮추기 위해 위치를 식별하는 데 도움을 필요로 합니다. 지도를 사용하여 (병원을 짓기 위해 구역법이나 어떤 잠재적인 건물을 제거해야 하는지에 대한 걱정 없이) 도시가 이 목표를 달성하는 데 도움이 되는 두 개의 위치를 식별할 수 있습니까?
병원 1에 대해 제안된 위도와 경도를 각각 lat_1과 long_1에 넣는다. (병원 2에 대해서도 마찬가지로)
그런 다음, 새 병원의 효과를 보기 위해 나머지 세포를 그대로 가동합니다. 두 개의 새 병원이 10% 미만으로 비율을 낮추면 정답으로 표시됩니다.
lat_1 = 40.6714
long_1 = -73.8492
# Your answer here: proposed location of hospital 2
lat_2 = 40.6702
long_2 = -73.7612
# Do not modify the code below this line
try:
new_df = pd.DataFrame(
{'Latitude': [lat_1, lat_2],
'Longitude': [long_1, long_2]})
new_gdf = gpd.GeoDataFrame(new_df, geometry=gpd.points_from_xy(new_df.Longitude, new_df.Latitude))
new_gdf.crs = {'init' :'epsg:4326'}
new_gdf = new_gdf.to_crs(epsg=2263)
# get new percentage
new_coverage = gpd.GeoDataFrame(geometry=new_gdf.geometry).buffer(10000)
new_my_union = new_coverage.geometry.unary_union
new_outside_range = outside_range.loc[~outside_range["geometry"].apply(lambda x: new_my_union.contains(x))]
new_percentage = round(100*len(new_outside_range)/len(collisions), 2)
print("(NEW) Percentage of collisions more than 10 km away from the closest hospital: {}%".format(new_percentage))
# Did you help the city to meet its goal?
q_6.check()
# make the map
m = folium.Map(location=[40.7, -74], zoom_start=11)
folium.GeoJson(coverage.geometry.to_crs(epsg=4326)).add_to(m)
folium.GeoJson(new_coverage.geometry.to_crs(epsg=4326)).add_to(m)
for idx, row in new_gdf.iterrows():
Marker([row['Latitude'], row['Longitude']]).add_to(m)
HeatMap(data=new_outside_range[['LATITUDE', 'LONGITUDE']], radius=9).add_to(m)
folium.LatLngPopup().add_to(m)
display(m)
except:
q_6.hint()